草庐IT

C++ operator+ 和 operator+= 重载

全部标签

c++ - C++中的运算符重载

如果我想重载运算符+,哪个原型(prototype)是正确的?D运算符+(constD&lhs,constD&rhs);然后将其声明为D的友元函数。D运算符+(constD&s);然后声明为D的成员函数。 最佳答案 第一个是正确的,第二个是完全错误的。你可以通过写这个来改进第二个Doperator+(constD&s)const;但还是错了。原因是编译器将在第二个版本中对+运算符的左右两侧应用不同的规则。例如给出这段代码classC{};classD{public:D(constC&);};Cc;Dd;d=d+c;//legalwi

重载函数的 C++ 异常规范

classESClass{public:voidPrintMe()throw();voidPrintMe(int)throw(int);};我想知道我们是否可以为重载函数定义不同的异常规范。换句话说,我们能否对PrintMe函数的不同版本给出不同的异常规范?NotefromVS2010:warningC4290:C++exceptionspecificationignoredexcepttoindicateafunctionisnot__declspec(nothrow) 最佳答案 是的:它们是不同的函数,它们可以有不同的异常规范。

c++ - 为分数类 C++ 重载 >>

我正在尝试为分数类重载流内运算符>>。我已经创建了一个函数,它可以从用户那里获取一个字符串并将其解析为我的Fraction类的正确参数,但我不确定如何在我的>>重载函数中实现它。用户可以输入三种类型的分数:1.整数(例如5)2.带分数(例如2+4/5)3.正分数(例如1/2)我的方法是在主函数中接受来自用户的字符串形式的输入,解析它以获得有效的Fraction类参数,然后将这个新创建的分数对象返回到流中。我只是不确定该怎么做。在我的运算符重载定义中,我有这个:istream&operator>>(istream&in,constFraction&input)但是如果我接受一个字符串,这

c++ - 使用基类的重载函数

我尝试做类似的事情classbase{public:virtualdoubleoperator()(doubleval)=0;virtualdoubleoperator()(doubleprev,doubleval){returnprev+operator()(val);}};classderived:publicbase{virtualdoubleoperator()(doubleval){returnsometing_clever;}};我想重载operator()以将其用于不同的算法,例如std::accumulate或std::transform。我对operator()(do

c++ - 是否可以在 C++ 中声明 operator= private 并同时由编译器合成

我对运算符=很满意,它由编译器自动合成。但我希望它是私有(private)的,并且不想用类型的页面长定义来膨胀我的代码Foo&Foo::operator=(constFoo&foo){if(this==&foo)return*this;member1_=foo.member1_;member2_=foo.member2_;member3_=foo.member2_;...member1000_=foo.member1000_;return*this;}请问有什么办法吗? 最佳答案 在C++11中是:classFoo{Foo&oper

c++ - 如何在 C++ 中将 operator= 与匿名对象一起使用?

我有一个带有重载运算符的类:IPAddress&IPAddress::operator=(IPAddress&other){if(this!=&other){deletedata;this->init(other.getVersion());other.toArray(this->data);}return*this;}当我尝试编译时:IPAddressx;x=IPAddress(IPV4,"192.168.2.10");我收到以下错误:main.cc:Infunction‘intmain()’:main.cc:43:39:error:nomatchfor‘operator=’in‘x

c++ - 具有引用参数的重载函数模板

templatevoidf(T&){}templatevoidf(T&&){}intmain(){intx;f(x);//ambiguous}为什么这个调用不明确?第一个模板特化是f(int&),第二个是f(int&).由于参数相同,根据偏序规则更特殊的函数模板更好。然后根据标准14.8.2.4/9If,foragiventype,deductionsucceedsinbothdirections(i.e.,thetypesareidenticalafterthetransformationsabove)andbothPandAwerereferencetypes(beforebein

c++ - 在成员函数中使用 operator()

我在我的一个类中重载了运算符(),我想在另一个成员函数中使用它。classA{public:voidoperator()();voidoperator()(doublex);};voidA::operator()(){//stuff};voidA::operator()(doublex){//stuffwithothermembersandxthis->operator();};行this->operator()不起作用。我只想使用我定义为类A的成员函数的运算符。我得到的错误是:Error1errorC3867:'A::operator()':functioncallmissingar

指针的 C++ 运算符重载

我想知道(出于好奇)为什么C++中的指针不允许运算符重载。我的意思是这样的:Vector2d*operator+(Vector2d*a,Vector2d*b){returnnewVector2d(a.x+b.x,a.y+b.y);}Vector2d*a=newVector2d(1,1);Vector2d*b=newVector2d(2,2);Vector2d*c=a+b;请注意“a+b”如何创建一个新的Vector对象,然后仅将其地址复制到“c”中,而不调用复制构造函数。所以它会解决新右值引用解决的相同问题。此外,据我所知,它几乎等同于在C#中使用运算符重载时发生的情况(但我在这里可能

c++ - C++ 中逗号分隔值的 `operator<<`

以下语法在OpenCV中有效MatR=(Mat_(4,4)怎么可能?哪个运算符重载了?这个表达的意义是什么?现在的C++可以重载逗号运算符吗? 最佳答案 可以重载逗号运算符,但通常不推荐这样做(在许多情况下,重载的逗号会造成混淆)。上面的表达式为4*4矩阵定义了16个值。如果您想知道这是怎么可能的,我将展示一个更简单的示例。假设我们希望能够写出类似的东西MyVectorR=(MyVector()然后我们可以定义MyVector使得和,运算符将新值附加到vector:templateclassMyVector:publicstd::v